﻿<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>HTML5模拟手电筒照明效果</title>

<style>
html, body {
  height: 100%;
  margin: 0;
}
svg {
  display: block;
}
</style>

</head>
<body>

<svg width="100%" height="100%"
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
>
  <filter id="light">
    <!-- blur the source image to make bump map less sharp -->
    <feGaussianBlur stdDeviation="3" result="blurred"></feGaussianBlur>
    <!-- create bump map based on alpha channel -->
    <feColorMatrix in="blurred" type="luminanceToAlpha" result="bumpMap"></feColorMatrix>
    <!-- use bump map for lighting filter -->
    <feDiffuseLighting in="bumpMap" surfaceScale="3" result="light">
      <fePointLight x="225" y="150" z="30"></fePointLight>
    </feDiffuseLighting>
    <!-- compose the lighting result with source image using multiplication -->
    <feComposite in="light" in2="SourceGraphic"
      operator="arithmetic"
      k1="1" k2="0" k3="0" k4="0">
    </feComposite>
  </filter>
  <pattern id="pattern1"
    width="450" height="300"
    patternUnits="userSpaceOnUse"
  >
    <image  xlink:href="img/codepen.jpg"
      width="450" height="300"
    ></image>
  </pattern>
  <rect width="100%" height="100%"
    fill="url(#pattern1)" filter="url(#light)"
  ></rect>
</svg>

<script>
const svgNode = document.querySelector('svg');
const fePointLightNode = svgNode.querySelector('fePointLight');
svgNode.addEventListener('mousemove', handleMove);
svgNode.addEventListener('touchmove', handleMove);
function handleMove(event) {
  fePointLightNode.setAttribute('x', event.clientX);
  fePointLightNode.setAttribute('y', event.clientY);
}
</script>
<div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';">
<p>适用浏览器：360、FireFox、Chrome、Opera、傲游、搜狗、世界之窗. 不支持Safari、IE8及以下浏览器。</p>
<p>更多请访问：<a href="https://github.com/sunyctf/css-effects" target="_blank">烤地瓜的GitHub</a></p>
</div>
</body>
</html>